/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sismol.data;

/**
 *
 * @author koji
 */
public class GerenciadorEstimativaBackup {
























//    public TrechoAtual buscaTrechoAtualPorTrechoIdLinhaId(Long trechoId, Long linhaId) {
//        StringBuilder sb = new StringBuilder();
//        sb.append("SELECT x FROM ").append(TrechoAtual.class.getSimpleName());
//        sb.append(" x WHERE x.trecho.id = :trechoId");
//        sb.append(" AND x.onibus.linha.id = :linhaId");
//        sb.append(" ORDER BY x.horaUltimoSinal DESC");
//
//        Query query = this.em.createQuery(sb.toString());
//        query.setParameter("trechoId", trechoId);
//        query.setParameter("linhaId", linhaId);
//
//        List<TrechoAtual> trechos = query.getResultList();
//        if(trechos.isEmpty()){
//            return null;
//        }
//        return trechos.get(0);
//    }

//    private Long buscaEstimativaAtePontoDesejado(List<Trecho> trechos) {
//        Long estimativa = 0L;
//
//        for (Trecho trecho : trechos) {
//            TempoMedio velocidade = this.buscaTempoMedioDoTrecho(trecho.getId());
//            Double velocidadeM = velocidade.getVelocidadeMedia();
//            Long distancia = velocidade.getTrecho().getDistancia();
//
//            Double tempoPorTrecho = distancia / velocidadeM;
//            Long tempo = tempoPorTrecho.longValue();
//
//            estimativa = estimativa + tempo;
//        }
//
//        return estimativa;
//    }

//    public Long buscaTempoEstimadoAtePonto(Long linhaId, Long pontoId) {
//        Linha linha = this.em.find(Linha.class, linhaId);
//        Ponto pontoDesejado = this.em.find(Ponto.class, pontoId);
//        List<Trecho> trechos = linha.getTrechos();
//        Trecho trechoInicial = null;
//        Trecho trechoFinal = null;
//        for (Trecho trecho : trechos) {
//            if (trecho.getPontoB().equals(pontoDesejado)) {
//                trechoFinal = trecho;
//                break;
//            }
//        }
//        if(trechoFinal == null) {
//            throw new RuntimeException("A linha de ônibus escolhida não passa pelo ponto.");
//        }
//
//        TrechoAtual trechoAtual = null;
//        for (int i = trechos.indexOf(trechoFinal); i >= 0; i--) {
//            Trecho trecho = trechos.get(i);
//            trechoAtual = this.buscaTrechoAtualPorTrechoIdLinhaId(trecho.getId(), linha.getId());
//
//            if (trechoAtual != null) {
//                trechoInicial = trecho;
//                break;
//            }
//        }
//
//        Long estimativa = 0L;
//        if(!trechoInicial.equals(trechoFinal)){
//            List<Trecho> trechosRestantes = trechos.subList(trechos.indexOf(trechoInicial) + 1, trechos.indexOf(trechoFinal));
//            estimativa = this.buscaEstimativaAtePontoDesejado(trechosRestantes);
//        }
//
//
//        Long distanciaRestante = trechoFinal.getDistancia() - trechoAtual.getDistanciaPercorrida();
//        Double estimativaAtual = distanciaRestante / (trechoAtual.getVelocidade()* 1000);
//
//        return estimativa + estimativaAtual.longValue();
//    }


//    public void processaInfoPonto(InfoPonto infoPonto) {
//        // Busca o trecho atual pelo id do ônibus.
//        TrechoAtual trechoAtual = this.buscaTrechoAtualPorOnibusId(infoPonto.getOnibusId());
//        Trecho trechoPercorrido = trechoAtual.getTrecho();
//
//        // Calcula o tempo gasto no último trecho.
//        Long horaInicial = trechoAtual.getHoraUltimoPonto().getTime();
//        Date dataFinal = new Date();
//        Long horaFinal = dataFinal.getTime();
//        Long tempo = horaFinal - horaInicial;
//
//        // Busca a VelocidadePonderada que faça sentido no atual contexto (dia da semana, trecho etc).
//        TempoMedio estimativa = this.buscaTempoMedioDoTrecho(trechoPercorrido.getId());
//
//        // Calcula a nova estimativa.
//        Long distancia = trechoPercorrido.getDistancia();
//        // Velocidade em m/ms.
//        Double velocidadeAtual = distancia.doubleValue() / (tempo.doubleValue());
//
//        Long total = estimativa.getSomaTotal();
//        Double velocidadeMedia = estimativa.getVelocidadeMedia();
//
//        Double novaVelocidadeMedia = ((velocidadeMedia*total) + velocidadeAtual) / (total + 1);
//
//        // Atualiza a estimativa.
//        estimativa.setSomaTotal(total + 1);
//        estimativa.setVelocidadeMedia(novaVelocidadeMedia);
//
//        // Atualiza o TrechoAtual.
//        List<Trecho> trechos = trechoAtual.getTrecho().getLinha().getTrechos();
//        Trecho proximo = trechos.get(trechos.indexOf(trechoAtual)+1);
//        trechoAtual.setTrecho(proximo);
//        trechoAtual.setHoraUltimoPonto(dataFinal);
//
//        this.em.getTransaction().begin();
//        this.em.merge(trechoAtual);
//        this.em.merge(estimativa);
//        this.em.getTransaction().commit();
//    }
//
//    public void processaInfoTrajetoria(InfoTrajetoria infoTrajetoria) {
//        // Busca o trecho atual pelo id do ônibus.
//        TrechoAtual trechoAtual = this.buscaTrechoAtualPorOnibusId(infoTrajetoria.getOnibusId());
//
//        // Atualiza TrechoAtual.
//        trechoAtual.setDistanciaPercorrida(infoTrajetoria.getDistanciaPercorrida());
//        trechoAtual.setVelocidade(infoTrajetoria.getVelocidade());
//
//        this.em.getTransaction().begin();
//        this.em.merge(trechoAtual);
//        this.em.getTransaction().commit();
//    }




//    public TrechoAtual buscaTrechoAtualPorTrechoIdLinhaId(Long trechoId, Long linhaId) {
//        StringBuilder sb = new StringBuilder();
//        sb.append("SELECT x FROM ").append(TrechoAtual.class.getSimpleName());
//        sb.append(" x WHERE x.trecho.id = :trechoId");
//        sb.append(" AND x.onibus.linha.id = :linhaId");
//        sb.append(" ORDER BY x.distanciaPercorrida DESC");
//
//        Query query = this.em.createQuery(sb.toString());
//        query.setParameter("trechoId", trechoId);
//        query.setParameter("linhaId", linhaId);
//
//        List<TrechoAtual> trechos = query.getResultList();
//        if(trechos.isEmpty()){
//            return null;
//        }
//        return trechos.get(0);
//    }


//    private Trecho buscaTrechoPorPontos(Long pontoInicialId, Long pontoFinalId) {
//        StringBuilder sb = new StringBuilder();
//        sb.append("SELECT x FROM ").append(Trecho.class.getSimpleName());
//        sb.append(" x WHERE x.pontoA.id = :pontoInicialId");
//        sb.append(" AND x.pontoB.id = :pontoFinalId");
//
//        Query query = this.em.createQuery(sb.toString());
//        query.setParameter("pontoInicialId", pontoInicialId);
//        query.setParameter("pontoFinalId", pontoFinalId);
//
//        return (Trecho) query.getSingleResult();
//    }
}
